/* 
 * File:   CommandManager.h
 * Author: Gab'z
 *
 * Created on 27 mai 2012, 20:14
 */

#ifndef COMMANDMANAGER_H
#define	COMMANDMANAGER_H

#include "../model/command/Command.h"
#include "../exception/CommandException.h"
#include "../model/memento/Memento.h"
#include "../log/LogSystem.h"

namespace calculator {
    class MementoCaretaker;
    class Engine;

    /**
     * Le gestionnaire de commande de l'application.
     * Cette classe a la charge d'exécuter proprement les commandes
     * et manipule les mementos pour les fonctions UNDO/REDO.
     * @param parentEngine Le moteur de l'application qui l'utilise.
     * @param mementoCaretaker Le conteneur intelligent de mementos utilisé pour
     * une exécution de l'application.
     */
    class CommandManager {
    public:
        /**
         * Constructeur de CommandManager.
         * @param engine Le moteur qui utilise ce gestionnaire de commande.
         * @param mementoCaretaker Le gestionnaire de mementos utilisé pour cette application.
         */
        CommandManager(Engine * const engine, MementoCaretaker * const mementoCaretaker);

        /**
         * Destructeur de Commandanager.
         * Ne détruit pas le moteur et le gestionnaire de mementos.
         */
        virtual ~CommandManager();
        std::string executeCommand(const Command* command) throw (CommandException);
        std::string getPreviousInputString() const;
    private:
        /**
         * Pointeur vers le moteur qui utilise ce gestionnaire de commande.
         * Ne peut pas être remplacé.
         */
        Engine * const _engine;
        /**
         * Pointeur vers le gestionnaire de mementos.
         * Ne peut pas être remplacé.
         */
        MementoCaretaker * const _mementoCaretaker;

        static Logger* log;
    };
}
#endif	/* COMMANDMANAGER_H */

